package com.example.regular;


/**
 * 正则表达式位置匹配
 *
 * @author ZhenWuWang
 */
public class LocationMatch
{

    public static void main(String[] args)
    {
//        match1();
//        match2();
//        match3();
//        match4();
        match5();
    }

    /**
     * ^和$
     * ^（脱字符）匹配开头，在多行匹配中匹配行开头
     * $（美元符）匹配结尾，在多行匹配中匹配行结尾
     */
    private static void match1()
    {
        String result = "hello".replaceAll("^|$", "#");
        System.out.println(result);
    }

    /**
     * \b和\B
     * \b是单词边界，具体就是\w和\W之间的位置，也包括\w和^之间的位置，也包括\w和$之间的位置
     * \B就是\b的反面的意思：非（单词边界），注意不是（非单词）边界
     */
    private static void match2()
    {
        String result = "[JS] Lesson_01.mp4".replaceAll("\\b", "#");
        System.out.println(result);

        result = "[JS] Lesson_01.mp4".replaceAll("\\B", "#");
        System.out.println(result);
    }

    /**
     * (?=p)和(?!p)
     * (?=p):其中p是一个子模式，即p前面的位置。
     * (?!p):(?=p)的反面
     */
    private static void match3()
    {
        String result = "hello".replaceAll("(?=l)", "#");
        //he#l#lo
        System.out.println(result);

        result = "hello".replaceAll("(?!l)", "#");
        //#h#ell#o#
        System.out.println(result);
    }

    /**
     * 数字的千位分隔符表示法
     */
    private static void match4()
    {
        String result = "123456789".replaceAll("(?=(\\d{3})+$)", ",");
        //,123,456,789
        System.out.println(result);

        result = "123456789".replaceAll("(?!^)(?=(\\d{3})+$)", ",");
        //123,456,789
        System.out.println(result);
    }

    /**
     * 验证密码问题
     * <p>
     * 密码长度6-12位，由数字、小写字符和大写字母组成，但必须至少包括2种字符。
     * <p>
     * 此题，如果写成多个正则来判断，比较容易。但要写成一个正则就比较困难。
     */
    private static void match5()
    {
        //至少包含两个字符
        String regex = "^[0-9a-zA-Z]{6,12}$";
        //至少包含两种字符
        //1.包含[0-9]和[a-z]:(?=.*[0-9])(?=.*[a-z])
        //2.包含[0-9]和[A-Z]:(?=.*[0-9])(?=.*[A-Z])
        //3.包含[0-9]和[A-Z]:(?=.*[a-z])(?=.*[A-Z])
        regex = "((?=.*[0-9])(?=.*[a-z])|(?=.*[0-9])(?=.*[A-Z])|(?=.*[a-z])(?=.*[A-Z]))" + regex;
        // false 全是数字
        System.out.println("1234567".matches(regex));
        // false 全是小写字母
        System.out.println( "abcdef".matches(regex));
        // false 全是大写字母
        System.out.println("ABCDEFGH".matches(regex));
        // false 不足6位
        System.out.println( "ab23C".matches(regex));
        // true 大写字母和数字
        System.out.println( "ABCDEF234".matches(regex));
        // true 三者都有
        System.out.println( "abcdEF234".matches(regex));
    }
}
